#include <stdio.h>
#include <stdlib.h>
#include "bmp.h"

/* Inicia todas las posiciones de la matriz con el color blanco. */
void inicializarData(tBitmap *bm) {
	tColor blanco;
	pintarPixel(&blanco, 255, 255, 255);
	for(int i = 0; i < MAX_COORD;i++)
		for(int j = 0;j < MAX_COORD;j++)
			bm->datos[i][j] = blanco;
}

/* Dado tres valores r,g y b, forman un color. */
void pintarPixel(tColor *color, unsigned char r, unsigned char g,
		unsigned char b) {
	color->color[0] = b;
	color->color[1] = g;
	color->color[2] = r;
}

/* Dados un punto inicial, un punto final, una tabla de datos y un color,
 * dibuja la linea que va desde el punto inicial hasta el punto final,
 * asignando en la tabla el color determinado mediante el algoritmo de
 * Bresenham simplificado. */
void dibujarLinea(tPunto inicial, tPunto final, tBitmap *bm, tColor color) {
	int err = 0, e2 = 0;
	tPunto dif = {0, 0}, s = {0, 0};
	dif.x = abs(final.x-inicial.x);
	dif.y = abs(final.y-inicial.y);
	if (inicial.x < final.x)
		s.x = 1;
	else
		s.x = -1;
	if (inicial.y < final.y)
		s.y = 1;
	else
		s.y = -1;
	err = dif.x-dif.y;
	while(1) {
		if((inicial.x >=0) && (inicial.x < MAX_COORD) && (inicial.y >= 0) && 
								(inicial.y < MAX_COORD))
			pintar(bm, color, inicial);
		if((inicial.x == final.x) && (inicial.y == final.y))
			break;
		e2 = 2*err;
		if(e2 > -dif.y) {
			err -= dif.y;
			inicial.x += s.x;
		}
		if(e2 <  dif.x) {
			err += dif.x;
			inicial.y += s.y;
		}
	}
}

/* Crea una imagen en base a los valores de la tabla bm. */
void crearImagen(FILE *imagen, tBitmap *bm) {
	char tipo[3] = TIPO;
	int datosCuatroBytes_1[6] = {TAMANIO, RESERVADOS, INICIO_DATOS,
			TAMANIO_ENCABEZADO, MAX_COORD, MAX_COORD};
	int datosCuatroBytes_2[6] = {COMPRESION, TAMANIO_DATOS, RESOLUCION,  
				RESOLUCION, COLORES_USADOS, COLORES_IMPORTANTES};
	short int datosDosBytes[2] = {PLANOS, TAMANIO_PIXEL};
	fwrite(tipo, sizeof(char), 2, imagen);  // tipo de la imagen
	/* Escribo el tamanio de la imagen, los bytes reservados, el inicio de datos,
	 * el tamanio del encabezado, el ancho y el alto */
	fwrite(datosCuatroBytes_1, sizeof(int), 6, imagen);
	// Escribo la cantidad de planos y el tamanio de un pixel en bits
	fwrite(datosDosBytes, SHORT_INT_SIZE, 2, imagen);
	/* Escribo la compresion, el tamanio de los datos de la imagen,
	* la resolucion horizontal, la resolucion vertical, el numero de
	* colores usados y la cantidad de colores importantes.*/
	fwrite(datosCuatroBytes_2, sizeof(int), 6, imagen);
	for (int i = MAX_COORD - 1;i >= 0;i--)
		for (int j = 0;j < MAX_COORD;j++)
			fwrite(bm->datos[i][j].color, sizeof(char), 3, imagen);
}

/* Asigna un color a un punto determinado de la tabla de datos. */
void pintar(tBitmap *bm, tColor color, tPunto punto) {
	// Intercambio coordenadas para que representen el sist. cartesiano.
	bm->datos[punto.y][punto.x] = color;
}
